package com.designpattern.design.bridge;

/**
 * 桥接模式-和兴抽象层抽象类聚合实现层的接口
 * 子类继承，调用实现层的接口就能调用实现层
 * @author 15790
 *
 */
public class BridgeTest {

	public static void main(String[] args) {
		//确立实现层手机品牌小米、
		Brand xiaomi = new Xiaomi();
		//确立抽象层手机是OLED手机,把小米聚合到抽象层中去
		OLEDPhone oledPhone=new OLEDPhone(xiaomi);
		oledPhone.call();
		oledPhone.game();
		//多一个品牌华为 多加一个类实现Brand接口就可以了
		Huawei huawei = new Huawei();
		oledPhone.brand=huawei;
		oledPhone.game();
		//如果此时想加一种手机类型全面屏手机 加一个手机继承phone就可以了
		//此时无论小米还是华为都能用全面屏
		FullScreenPhone screenPhone = new FullScreenPhone(xiaomi);
		screenPhone.sendMessage();
		//如果此时要加上苹果IOS手机 那么brand和Phone各自多一个实现就可以了
		//并且此时huawei和xiaomi也能用ios手机类型 功能扩展了很多
	}
}

/**
 * 实现层接口-品牌接口
 * @author 15790
 *
 */
interface Brand {
	void call();
	void sendMessage();
	void game();
}

/**
 * 实现层-小米手机
 * @author 15790
 *
 */
class Xiaomi implements Brand{

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println("小米手机打电话");
	}

	@Override
	public void sendMessage() {
		// TODO Auto-generated method stub
		System.out.println("小米手机发短信");
	}

	@Override
	public void game() {
		// TODO Auto-generated method stub
		System.out.println("小米手机玩游戏");
	}
	
}

class Huawei implements Brand{

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println("华为手机打电话");
	}

	@Override
	public void sendMessage() {
		// TODO Auto-generated method stub
		System.out.println("华为手机发短信");
	}

	@Override
	public void game() {
		// TODO Auto-generated method stub
		System.out.println("华为手机玩游戏");
	}
	
}

/**
 * 抽象层-手机
 * @author 15790
 *
 */
abstract class Phone {
	
	protected Brand brand;

	public Phone(Brand brand) {
		super();
		this.brand = brand;
	}

}

/**
 * 抽象层实现类-OLED手机
 * @author 15790
 *
 */
class OLEDPhone extends Phone{

	public OLEDPhone(Brand brand) {
		super(brand);
		// TODO Auto-generated constructor stub
	}
	
	/**
	 * 使用OLED手机打电话
	 */
	
	public void call() {
		System.out.println("使用OLED屏幕手机打电话");
		brand.call();
	}
	
	public void sendMessage() {
		System.out.println("使用OLED手机发短信");
		brand.sendMessage();
	}
	
	public void game() {
		System.out.println("使用OLED手机打游戏");
		brand.game();
	}
	
}

class FullScreenPhone extends Phone{

	public FullScreenPhone(Brand brand) {
		super(brand);
		// TODO Auto-generated constructor stub
	}
	/**
	 * 使用全面屏手机打电话
	 */
	
	public void call() {
		System.out.println("使用全面屏手机打电话");
		brand.call();
	}
	
	public void sendMessage() {
		System.out.println("使用全面屏手机发短信");
		brand.sendMessage();
	}
	
	public void game() {
		System.out.println("使用全面屏手机打游戏");
		brand.game();
	}
}